package com.wn.demo02;

import java.lang.reflect.Field;

/**
 * @author yellow Docter
 * @date 2022 -10-28
 * @desc
 *    思路：
 *     1. 反射拿到Class对象
 *     2、反射拿到所有的属性
 *     3、反射拿到属性上面定义的注解
 *     4、拿到注解中的值
 *     5、属性反射进行赋值
 */
public class Demo06 {

    public static void main(String[] args) throws Exception {
        //反射拿到Class对象
        Class<User> clazz = (Class<User>) Class.forName("com.wn.demo02.User");

        User user = clazz.newInstance();
        //反射拿到所有的属性
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {

            //反射拿到属性上面定义的注解
            if (field.isAnnotationPresent(MyValue.class)){

                //跳过安全检查
                field.setAccessible(true);

                MyValue myValue = field.getAnnotation(MyValue.class);
                System.out.println(myValue.value());

                // 拿到注解中的值
                String value = myValue.value();
                // 反射赋值
                Class<?> type = field.getType();
                if (type == String.class){
                    field.set(user,value);
                }
                if (type == Integer.class){
                    field.set(user,Integer.valueOf(value));
                }
            }
        }
        System.out.println("user = " + user);
    }

}
